using System.Collections.Generic;

namespace Neo4jRestSharp.Neo4jObjectServices
{
	public interface INodeObjectServices
	{
	    /// <summary>
	    /// Get root node
	    /// </summary>
	    /// <remarks>
	    /// Http Success Response: 200 (a-ok)
	    /// Http Content:
	    /// { 
	    ///     "reference node": "http://localhost:9999/node/0",
	    ///     "index": "http://localhost:9999/index"
	    /// }
	    /// </remarks>
        RootNode GetRootNode();

	    /// <summary>
	    /// Create node
	    /// </summary>
	    /// <remarks>
	    /// Http Success Response: 201 (node was created)
	    /// Http Error Response: 400 (invalid data sent)
	    /// Http Content:
	    /// {
	    /// }
	    /// </remarks>
        T CreateNode<T>() where T : Node, new();

	    /// <summary>
	    /// Get node by id
	    /// </summary>
	    /// <remarks>
	    /// Http Success Response: 200 (a-ok)
	    /// Http Error Response: 404 (node not found)
	    /// Http Content:
	    /// {
	    /// }
	    /// </remarks>
	    T GetNode<T>(int nodeId) where T : Node, new();

	    /// <summary>
	    /// Set properties on node
	    /// </summary>
	    /// <remarks>
	    /// Http Success Response: 204 (ok, no content returned)
	    /// Http Error Response: 400 (invalid data sent)
	    /// Http Error Response: 404 (node not found)
	    /// Http Content:
	    /// {
	    /// }
	    /// </remarks>
	    void SetNodeProperties<T>(T node) where T : Node;

	    /// <summary>
	    /// Get properties on node
	    /// </summary>
	    /// <remarks>
	    /// Http Success Response: 200 (a-ok)
	    /// Http Success Response: 204 (ok, no properties found)
	    /// Http Error Response: 404 (node not found)
	    /// Http Content:
	    /// {
	    /// }
	    /// </remarks>
	    void GetNodeProperties<T>(T node) where T : Node;

	    /// <summary>
	    /// Remove all properties on node
	    /// </summary>
	    /// <remarks>        
	    /// Http Success Response: 204 (ok, no properties found)
	    /// Http Error Response: 404 (node not found)
	    /// Http Content:
	    /// {
	    /// }
	    /// </remarks>
	    void RemoveNodeProperties<T>(T node) where T : Node;

	    /// <summary>
	    /// Remove all properties on node
	    /// </summary>
	    /// <remarks>        
	    /// Http Success Response: 204 (ok, no properties found)
	    /// Http Error Response: 404 (node not found)
	    /// Http Content:
	    /// {
	    /// }
	    /// </remarks>
	    void RemoveNodeProperties(int nodeId);

	    /// <summary>
	    /// Set property on node
	    /// </summary>
	    /// <remarks>
	    /// Http Success Response: 204 (ok, no content returned)
	    /// Http Error Response: 400 (invalid data sent)
	    /// Http Error Response: 404 (node not found)
	    /// Http Content:
	    /// {
	    /// }
	    /// </remarks>
        void SetNodeProperty(int nodeId, string propertyName, string propertyValue);

	    /// <summary>
	    /// Get property on node
	    /// </summary>
	    /// <remarks>
	    /// Http Success Response: 200 (a-ok)        
	    /// Http Error Response: 404 (node or property not found)
	    /// Http Content:
	    /// {
	    /// }
	    /// </remarks>
	    string GetNodeProperty(int nodeId, string propertyName);

	    /// <summary>
	    /// Remove property on node
	    /// </summary>
	    /// <remarks>
	    /// Http Success Response: 204 (a-ok)        
	    /// Http Error Response: 404 (node or property not found)
	    /// Http Content:
	    /// {
	    /// }
	    /// </remarks>
        void RemoveNodeProperty(int nodeId, string propertyName);

	    /// <summary>
	    /// Delete node
	    /// </summary>
	    /// <remarks>
	    /// Http Success Response: 204 (a-ok)        
	    /// Http Error Response: 404 (node not found)
	    /// Http Error Response: 409 (Node could not be deleted (still has relationships?))
	    /// Http Content:
	    /// {
	    /// }
	    /// </remarks>
        void DeleteNode<T>(T node) where T : Node;
	}
}